home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / m / musik / music / source / music.lst
Encoding:
File List  |  1996-11-17  |  45.5 KB  |  1,748 lines

  1. '                                               Version vom 09.09.87      17:30
  2. ON BREAK GOSUB break
  3. DEFLIST 0
  4. OPENW 0
  5. GOSUB initall
  6. ON ERROR GOSUB fehler
  7. GOSUB edit
  8. '
  9. PROCEDURE initall
  10.   ON ERROR GOSUB initerror
  11.   filemax%=1000
  12.   DIM takt$(2),takte$(2,filemax%),taktbuf$(2),volume%(2),tsave$(2)
  13.   ARRAYFILL volume%(),11
  14.   pfad$="\STUECKE.MUS\"
  15.   IF NOT EXIST(pfad$+"*.MUS")
  16.     pfad$="\"
  17.   ENDIF
  18.   y1%=60              ! Zeilenabstand
  19.   okt%=4              ! Verschiebt oktavenweise
  20.   y0%=60              ! oberste Zeile
  21.   x0%=8               ! linker Rand
  22.   dist%=4             ! Abstand zwischen Noten in Bytes (gerade Anzahl!)
  23.   GOSUB initmenu
  24.   GOSUB initmc
  25.   GOSUB initmouse
  26.   GOSUB initplot
  27.   GOSUB initedit
  28.   GOSUB initcomp
  29. RETURN
  30. '
  31. PROCEDURE initerror
  32.   IF ERR=-33
  33.     ALERT 3,"Das file 'MUSIC.IMG' muß sich|im selben Ordner befinden,|von dem aus das Programm|gestartet wurde!",1,"Abbruch",dummy
  34.   ENDIF
  35.   RESUME
  36. RETURN
  37. '
  38. PROCEDURE edit
  39.   LOCAL i%,j%,x%,y%,k%,laenge%,hoehe%,hals%,not$,laenge$,oktave$
  40.   LOCAL punkt$
  41.   MENU grundmenue$()
  42.   ON MENU  GOSUB grundmenue
  43.   laenge%=8
  44.   FOR i%=0 TO 2
  45.     takt$(i%)=takte$(i%,filep%)
  46.   NEXT i%
  47.   PRINT AT(1,3);"Taktnr. ";filep%,,
  48.   GOSUB headline
  49.   IF LEN(takt$(1)+takt$(2)+takt$(0))<>0
  50.     @plottakt(yedit%(0)-1,abst%)
  51.   ELSE
  52.     FOR i%=0 TO 2
  53.       @drawline(yedit%(i%)-1)
  54.       @schluessel(yedit%(i%))
  55.     NEXT i%
  56.     @taktstrich(lrand%-2,yedit%(0),abst%)
  57.   ENDIF
  58.   CLR y0hilfsalt%
  59.   DEFMOUSE mouse$(laenge%)
  60.   DEFTEXT ,1,,13
  61.   RBOX 220,360,300,379
  62.   TEXT 230,375,62,"Zurück"
  63.   RBOX 300,360,380,379
  64.   TEXT 310,375,62,"Weiter"
  65.   DEFTEXT ,0,,13
  66.   @disable
  67.   DO
  68.     MOUSE x%,y%,k%
  69.     neu!=FALSE
  70.     IF y%>=400
  71.       GOSUB edithilfs(x%-16*(laenge%=22 OR laenge%=23),yedit%(0),yedit%(0))
  72.       CLR y0hilfsalt%
  73.       DEFMOUSE 3
  74.       no_menue!=TRUE
  75.       REPEAT
  76.         MOUSE x%,y%,k%
  77.         ON MENU
  78.       UNTIL y%<400 AND MENU(9)=34
  79.       DEFMOUSE mouse$(laenge%)
  80.       IF NOT no_menue!
  81.         IF neu!
  82.           @eraeditfeld
  83.           FOR i%=0 TO 2
  84.             takt$(i%)=takte$(i%,filep%)
  85.           NEXT i%
  86.           PRINT AT(1,3);"Taktnr. ";filep%,,
  87.         ENDIF
  88.         @plottakt(yedit%(0)-1,abst%)
  89.       ENDIF
  90.     ELSE
  91.       IF y%>360 AND x%>220 AND x%<380 AND k%                 !Zurück/Weiter
  92.         CLR y0hilfsalt%
  93.         IF edflag!
  94.           IF filep%<maxfilep%
  95.             @ask
  96.           ELSE
  97.             @put_t_to_taktfeld
  98.             @insert
  99.           ENDIF
  100.           CLR edflag!
  101.         ENDIF
  102.         IF x%<300                           !Zurück
  103.           filep%=MAX(0,filep%-1)
  104.           @find_akt_vorz
  105.         ELSE                                !Weiter
  106.           filep%=MIN(maxfilep%,filep%+1)
  107.         ENDIF
  108.         PRINT AT(1,3);"Taktnr. ";filep%,,
  109.         @eraeditfeld
  110.         FOR i%=0 TO 2
  111.           takt$(i%)=takte$(i%,filep%)
  112.         NEXT i%
  113.         @plottakt(yedit%(0)-1,abst%)
  114.       ELSE
  115.         IF y%<27 AND x%<24*26 AND k%=1
  116.           IF x% DIV 24<>laenge%
  117.             PRINT CHR$(7);
  118.             laenge%=x% DIV 24
  119.             DEFMOUSE mouse$(laenge%)
  120.           ENDIF
  121.         ENDIF
  122.         chan%=-(y%>grenz1%)-(y%>grenz2%)
  123.         IF k%=0
  124.           GOSUB edithilfs(x%-16*(laenge%=22 OR laenge%=23),MIN(MAX(y%,grenz0%),grenz3%),yedit%(chan%)-1)
  125.         ENDIF
  126.         IF k%<>0 AND y%>grenz0% AND y%<grenz3%
  127.           IF x%>=lrand%*8
  128.             CLR y0hilfsalt%
  129.             CLR vorz$
  130.             IF laenge%>=22 AND laenge%<=25
  131.               ADD x%,16
  132.               not$=t$(chan%,x% DIV 16)       ! schlechter Stil ...
  133.               CLR oktave$,laenge$,punkt$
  134.               vorz$="b"
  135.               IF laenge%=23
  136.                 vorz$="#"
  137.               ENDIF
  138.               IF laenge%=24
  139.                 vorz$="§"
  140.               ENDIF
  141.               IF laenge%=25
  142.                 vorz$="@"
  143.               ENDIF
  144.               t$(chan%,x% DIV 16)=vorz$
  145.             ELSE
  146.               IF laenge%<14
  147.                 ADD y%,2
  148.                 hoehe%=(y%-yedit%(chan%)+33)/3            ! höchstes C
  149.                 not$=noten$(7-(hoehe% MOD 7))
  150.                 oktave$=STR$(maxokt%-(hoehe% DIV 7)-(not$="C"))
  151.                 laenge$=STR$((laenge% DIV 2)+1)
  152.               ELSE
  153.                 not$="P"
  154.                 oktave$="P"
  155.                 y%=yedit%(chan%)
  156.                 laenge$=STR$((laenge% DIV 2)-5)
  157.               ENDIF
  158.               CLR punkt$,vorz$
  159.               IF ODD(laenge%)
  160.                 punkt$="."
  161.               ENDIF
  162.             ENDIF
  163.             edflag!=TRUE
  164.             replace!=t$(chan%,x% DIV 16)<>""
  165.             IF k%=1
  166.               t$(chan%,x% DIV 16)=vorz$+not$+oktave$+laenge$+punkt$
  167.             ELSE
  168.               t$(chan%,x% DIV 16)=""
  169.             ENDIF
  170.             IF replace!
  171.               @put_t_to_taktfeld
  172.               @plottakt(yedit%(0)-1,abst%)
  173.             ELSE
  174.               IF k%=1
  175.                 IF y%>yedit%(chan%)+12
  176.                   hals%=1
  177.                 ELSE
  178.                   hals%=-1
  179.                 ENDIF
  180.                 HIDEM
  181.                 @plotnote(laenge%,hals%,TRUE,2*(x% DIV 16),3*(y% DIV 3),vorz$)
  182.                 SHOWM
  183.               ENDIF
  184.             ENDIF
  185.             REPEAT
  186.             UNTIL MOUSEK=0
  187.           ELSE
  188.             IF laenge%>=22 AND laenge%<=24
  189.               WHILE y%>grenz1%
  190.                 SUB y%,abst%
  191.               WEND
  192.               IF y%>=yedit%(0)-6 AND y%<yedit%(0)+30 AND x% DIV 8<lrand%-4
  193.                 hoehe%=(y%-yedit%(0)+2-(laenge%=22)) DIV 3
  194.                 not$=CHR$(97+(6-(hoehe% MOD 7)))
  195.                 IF not$="b"
  196.                   not$="h"
  197.                 ENDIF
  198.                 vorz$="§"
  199.                 IF laenge%=23
  200.                   vorz$="#"
  201.                 ENDIF
  202.                 IF laenge%=22
  203.                   vorz$="b"
  204.                 ENDIF
  205.                 @put_t_to_taktfeld
  206.                 IF LEFT$(takt$(0),2)="c§"
  207.                   takt$(0)=MID$(takt$(0),3)
  208.                 ENDIF
  209.                 takt$(0)=not$+vorz$+takt$(0)
  210.                 IF k%=2 OR vorz$="§"
  211.                   WHILE LEFT$(takt$(0))>="a" AND LEFT$(takt$(0))<="h" AND LEFT$(takt$(0))<>"b"
  212.                     takt$(0)=MID$(takt$(0),3)
  213.                   WEND
  214.                   @clear_vorz
  215.                 ENDIF
  216.                 IF vorz$="§" AND k%=1
  217.                   takt$(0)="c§"+takt$(0)
  218.                 ENDIF
  219.                 @plottakt(yedit%(0)-1,abst%)
  220.                 edflag!=TRUE
  221.               ENDIF
  222.             ENDIF
  223.           ENDIF
  224.         ENDIF
  225.       ENDIF
  226.       inp$=INKEY$
  227.       IF inp$=" "
  228.         CLR y0hilfsalt%
  229.         @put_t_to_taktfeld
  230.         @plottakt(yedit%(0)-1,abst%)
  231.       ELSE
  232.         IF RIGHT$(inp$)=CHR$(&H62)
  233.           @anleitung
  234.         ENDIF
  235.       ENDIF
  236.     ENDIF
  237.   LOOP
  238.   @put_t_to_taktfeld
  239.   DEFMOUSE 0
  240. RETURN
  241. '
  242. PROCEDURE edithilfs(x%,y%,y0%)
  243.   LOCAL i%,xtemp%
  244.   xtemp%=x% AND &HFFFFFFF0
  245.   IF xtemp%<>xhilfsalt% OR y%<>yhilfsalt%
  246.     GRAPHMODE 3
  247.     IF y0hilfsalt%<>0
  248.       FOR i%=y0hilfsalt% TO yhilfsalt% STEP stephilfsalt%
  249.         LINE xhilfsalt%-2,i%,xhilfsalt%+10,i%
  250.       NEXT i%
  251.     ENDIF
  252.     xhilfsalt%=xtemp%
  253.     yhilfsalt%=y%
  254.     CLR y0hilfsalt%
  255.     IF y%<y0%-4
  256.       FOR i%=y0%-6 TO y% STEP -6
  257.         LINE xhilfsalt%-2,i%,xhilfsalt%+10,i%
  258.       NEXT i%
  259.       stephilfsalt%=-6
  260.       y0hilfsalt%=y0%-6
  261.     ENDIF
  262.     IF y%>y0%+28
  263.       FOR i%=y0%+30 TO y% STEP 6
  264.         LINE xhilfsalt%-2,i%,xhilfsalt%+10,i%
  265.       NEXT i%
  266.       stephilfsalt%=6
  267.       y0hilfsalt%=y0%+30
  268.     ENDIF
  269.     GRAPHMODE 1
  270.   ENDIF
  271. RETURN
  272. '
  273. PROCEDURE put_t_to_taktfeld
  274.   LOCAL i%,j%,t$,k%
  275.   FOR i%=0 TO 2
  276.     t$=""
  277.     FOR j%=0 TO 40
  278.       t$=t$+t$(i%,j%)
  279.       t$(i%,j%)=""
  280.     NEXT j%
  281.     k%=1
  282.     WHILE MID$(t$,k%,1)>="a" AND MID$(t$,k%,1)<="h"
  283.       ADD k%,2
  284.     WEND
  285.     REPEAT
  286.       j%=INSTR(t$,"#@",k%) OR INSTR(t$,"b@",k%) OR INSTR(t$,"§@",k%)
  287.       IF j%
  288.         MID$(t$,j%,2)="@"+MID$(t$,j%,1)
  289.       ENDIF
  290.     UNTIL j%=0
  291.     FOR j%=k% TO LEN(t$)-1
  292.       temp$=MID$(t$,j%,1)
  293.       IF temp$="#" OR temp$="b" OR temp$="§"
  294.         temp2$=MID$(t$,j%+1,1)
  295.         IF temp2$="#" OR temp2$="b" OR temp2$="§"
  296.           t$=LEFT$(t$,j%)+MID$(t$,j%+2)
  297.         ENDIF
  298.         IF temp2$="P"
  299.           t$=LEFT$(t$,j%-1)+MID$(t$,j%+1)
  300.         ENDIF
  301.       ENDIF
  302.     NEXT j%
  303.     IF RIGHT$(t$)="b" OR RIGHT$(t$)="#" OR RIGHT$(t$)="§" OR RIGHT$(t$)="@"
  304.       IF MID$(t$,LEN(t$)-1,1)>"h" OR MID$(t$,LEN(t$)-1,1)<"a"
  305.         t$=LEFT$(t$,LEN(t$)-1)
  306.       ENDIF
  307.     ENDIF
  308.     takt$(i%)=t$+"|"
  309.   NEXT i%
  310. RETURN
  311. '
  312. PROCEDURE headline
  313.   LOCAL laenge%
  314.   DEFFILL 0
  315.   HIDEM
  316.   PBOX 0,0,639,32
  317.   LINE 0,27,639,27
  318.   FOR laenge%=0 TO 21
  319.     IF laenge%<14
  320.       y%=24
  321.     ELSE
  322.       y%=8
  323.     ENDIF
  324.     @plotnote(laenge%,1,TRUE,laenge%*2,y%,"")
  325.   NEXT laenge%
  326.   INC laenge%
  327.   y%=16
  328.   @plotvorz(laenge%*2,y%,0)
  329.   @plotvorz(laenge%*2+2,y%,1)
  330.   @plotvorz(laenge%*2+4,y%,2)
  331.   DEFTEXT ,1,,6
  332.   TEXT (laenge%*2+6)*8,y%,"3"
  333.   DEFTEXT ,0,,13
  334.   x%=0
  335.   FOR i%=1 TO laenge%+1
  336.     GET x%,19,639-8,26+19,temp$
  337.     PBOX x%,0,x%+8,26
  338.     PUT x%+8,19,temp$
  339.     ADD x%,24
  340.   NEXT i%
  341.   SHOWM
  342. RETURN
  343. '
  344. PROCEDURE plottakt(y0%,y1%)
  345.   LOCAL x%,i%,xmin%,v%,tsave$
  346.   DIM index%(2)
  347.   tsave$=takt$(0)
  348.   ARRAYFILL index%(),1
  349.   ARRAYFILL c%(),0
  350.   DEFFILL 0
  351.   HIDEM
  352.   PBOX 0,y0%-35,639,y0%+3*y1%
  353.   IF LEFT$(takt$(0))>="a" AND LEFT$(takt$(0))<="h" AND LEFT$(takt$(0))<>"b"
  354.     @set_glob_vorz
  355.     PRINT AT(50,3);"Vorzeichen in Taktnr. ";filep%;"  "
  356.   ENDIF
  357.   @put_glob_vorz
  358.   @taktstrich(lrand%-1,yedit%(0),abst%)
  359.   IF LEN(takt$(1)+takt$(2)+takt$(0))=0
  360.     FOR i%=0 TO 2
  361.       @drawline(y0%+i%*y1%)
  362.       @schluessel(y0%+i%*y1%)
  363.     NEXT i%
  364.   ELSE
  365.     FOR i%=0 TO 2
  366.       @drawline(i%*y1%+y0%)           ! Notenzeile
  367.       @schluessel(i%*y1%+y0%)
  368.       @gettakt(i%,takt$(i%))          ! belegt Felder für Tonkanal i% (s. gettakt)
  369.     NEXT i%
  370.     x%=lrand%
  371.     ADD x%,2
  372.     ' Ordnet Noten der drei Kanäle passend nach Dauer untereinander an
  373.     WHILE c%(0)<>count%(0) OR c%(1)<>count%(1) OR c%(2)<>count%(2)
  374.       xmin%=MIN(x%(0,c%(0)),x%(1,c%(1)),x%(2,c%(2)))
  375.       FOR i%=0 TO 2
  376.         j%=c%(i%)
  377.         IF x%(i%,j%)=xmin%
  378.           @restore_t_string(i%,x% DIV 2)
  379.           vorz$=vorz$(vorz%(i%,j%))
  380.           '
  381.           IF triole!(i%,j%)
  382.             @plottriole(i%,x%)
  383.           ENDIF
  384.           @plotnote(laenge%(i%,j%),hhals%(i%,j%),sep!(i%,j%),x%,y0%+y1%*i%+y%(i%,j%),vorz$)
  385.           @hilfszeilen(y1%*i%+y0%,x%,y%(i%,j%))
  386.           INC c%(i%)
  387.         ENDIF
  388.       NEXT i%
  389.       ADD x%,dist%
  390.     WEND
  391.     @taktstrich(x%,y0%,y1%)
  392.   ENDIF
  393.   takt$(0)=tsave$
  394.   ERASE index%()
  395.   SHOWM
  396. RETURN
  397. '
  398. PROCEDURE plottriole(chan%,x%)
  399.   DEFTEXT ,1,,6
  400.   TEXT x%*8-2,y0%+y1%*chan%+y%(chan%,j%),"3"
  401.   DEFTEXT ,0,,13
  402. RETURN
  403. '
  404. PROCEDURE put_glob_vorz
  405.   LOCAL j%,h%
  406.   FOR j%=5 TO 29 STEP 4
  407.     h%=j% MOD 7
  408.     IF vorzeichen$(h%)<>""
  409.       FOR i%=0 TO 2
  410.         y%=15-3*h%+yedit%(i%)
  411.         @plotvorz(j% DIV 4+3,y%,-(vorzeichen$(h%)="#")-2*vorzeichen$(h%)="§")
  412.       NEXT i%
  413.     ENDIF
  414.   NEXT j%
  415. RETURN
  416. '
  417. PROCEDURE plotvorz(x%,y%,v%)
  418.   LOCAL k%,bildadr%
  419.   bildadr%=XBIOS(2)+(y%-10+v%+19)*80+x%-1
  420.   FOR k%=0 TO 15
  421.     POKE bildadr%,PEEK(bildadr%) OR vorzplot%(v%,k%)
  422.     ADD bildadr%,80
  423.   NEXT k%
  424. RETURN
  425. '
  426. PROCEDURE restore_t_string(chan%,x%)
  427.   LOCAL t$,temp$
  428.   t$=MID$(takt$(chan%),index%(chan%),3)
  429.   ADD index%(chan%),3
  430.   temp$=MID$(takt$(chan%),index%(chan%),1)
  431.   WHILE temp$<>"@" AND temp$<>"|" AND temp$<>"b" AND temp$<>"#" AND temp$<>"§" AND (temp$<"A" OR temp$>"P")
  432.     t$=t$+temp$
  433.     INC index%(chan%)
  434.     temp$=MID$(takt$(chan%),index%(chan%),1)
  435.   WEND
  436.   IF x%>40
  437.     ALERT 1,"        Zeile zu lang!        ",1,"  Stop  |  Cont  ",x%
  438.     IF x%=1
  439.       ERROR 100
  440.     ENDIF
  441.   ELSE
  442.     t$(chan%,x%)=t$
  443.   ENDIF
  444. RETURN
  445. '
  446. PROCEDURE taktstrich(x%,y0%,y1%)
  447.   LINE x%*8,y0%,x%*8,y0%+2*y1%+24          ! Taktstrich
  448.   LINE x%*8+1,y0%,x%*8+1,y0%+2*y1%+24
  449. RETURN
  450. '
  451. PROCEDURE schluessel(z%)
  452.   LOCAL i%
  453.   HIDEM
  454.   LET lpoke%=VARPTR(lpoke$)
  455.   CALL lpoke%((z%-12+19)*80,VARPTR(schluessel%(0)),50,0)
  456.   SHOWM
  457. RETURN
  458. schluessel:
  459. DATA 30720,63488,116736,231424,198656
  460. DATA 395264,395264,264192,268288,268288
  461. DATA 274432,290816,319488,376832,491520
  462. DATA 458752,917504,1835008,3932160,7602176
  463. DATA 14942208,29622272,58982400,119521280,239067136
  464. DATA 209711104,417609728,281286656,277089280,277089280
  465. DATA 277087232,277087232,277087232,272892928,136579072
  466. DATA 67373056,33820672,25452544,8355840,262144
  467. DATA 262144,262144,262144,262144,29622272
  468. DATA 65273856,65273856,46399488,50855936,32505856
  469. '
  470. PROCEDURE drawline(y1%)     ! Notenzeile
  471.   LOCAL i%
  472.   FOR i%=0 TO 4
  473.     LINE 0,y1%+6*i%,639,y1%+6*i%
  474.   NEXT i%
  475. RETURN
  476. '
  477. PROCEDURE gettakt(chan%,takt$)
  478.   ' Übergibt Ergebnisse für einen Takt in:
  479.   ' laenge%(chan%,count%)  : Tonlänge von 0 bis 12
  480.   ' hhals%(      "      )  : Richtung bzw. Länge des Notenhalses
  481.   ' vorz%(       "      )  : +1 = # ; -1 = b   | 1=b 2=# 3=§
  482.   ' sep!(        "      )  : Einzelnote
  483.   ' x%  (        "      )  : Spalte in Bytes
  484.   ' y%  (        "      )  : Pixelreihe ohne y0%!
  485.   LOCAL j%,hoehe%,laenge%,y%,i%,c%,hals%,x%,temp%
  486.   CLR x%,c%
  487.   j%=1
  488.   WHILE j%<LEN(takt$)
  489.     CLR hoehe%
  490.     vorz%(chan%,c%)=0
  491.     triole!(chan%,c%)=MID$(takt$,j%,1)="@"
  492.     IF triole!(chan%,c%)
  493.       INC j%
  494.     ENDIF
  495.     IF MID$(takt$,j%,1)="b"
  496.       vorz%(chan%,c%)=1
  497.       INC j%
  498.     ELSE
  499.       IF MID$(takt$,j%,1)="#"
  500.         vorz%(chan%,c%)=2
  501.         INC j%
  502.       ELSE
  503.         IF MID$(takt$,j%,1)="§"
  504.           vorz%(chan%,c%)=3
  505.           INC j%
  506.         ENDIF
  507.       ENDIF
  508.     ENDIF
  509.     IF MID$(takt$,j%,1)="@"
  510.       triole!(chan%,c%)=TRUE
  511.       INC j%
  512.     ENDIF
  513.     IF MID$(takt$,j%,1)="P"
  514.       y%=8
  515.       ADD j%,2
  516.       laenge%=2*(ASC(MID$(takt$,j%))-48)+10
  517.     ELSE
  518.       FOR hoehe%=0 TO 7
  519.         EXIT IF MID$(takt$,j%,1)=noten$(hoehe%)
  520.       NEXT hoehe%
  521.       IF hoehe%>7
  522.         ALERT 3,"Schlechter Takt!|Pointer: "+STR$(j%)+"|"+takt$,1," Stop ",dummy
  523.         END
  524.       ENDIF
  525.       INC j%
  526.       y%=10-(hoehe%*3+21*(ASC(MID$(takt$,j%))-48-okt%))
  527.       INC j%
  528.       laenge%=2*(ASC(MID$(takt$,j%))-48)-2
  529.     ENDIF
  530.     temp%=2^(ASC(MID$(takt$,j%))-48)
  531.     INC j%
  532.     IF MID$(takt$,j%,1)="."
  533.       INC laenge%
  534.       INC j%
  535.       MUL temp%,1.5
  536.     ENDIF
  537.     hals%=16
  538.     IF y%<12
  539.       hals%=-hals%
  540.     ENDIF
  541.     laenge%(chan%,c%)=laenge%
  542.     hhals%(chan%,c%)=hals%
  543.     sep!(chan%,c%)=TRUE
  544.     x%(chan%,c%)=x%
  545.     y%(chan%,c%)=y%
  546.     ADD x%,temp%
  547.     INC c%
  548.     IF MID$(takt$,j%,1)="-"
  549.       INC j%                              ! Bögen noch nicht implementiert.
  550.     ENDIF
  551.   WEND
  552.   x%(chan%,c%)=&H7FFFFFFF
  553.   count%(chan%)=c%
  554. RETURN
  555. '
  556. PROCEDURE initmc
  557.   LOCAL a$
  558.   cmc$=STRING$(2048,CHR$(0))
  559.   vorzeichen$="12345678"
  560.   BLOAD "MUSIC.IMG",VARPTR(cmc$)
  561.   CLR lpoke$
  562.   RESTORE llpoke
  563.   READ a$
  564.   WHILE LEFT$(a$)<>"*"
  565.     LET lpoke$=lpoke$+MKI$(VAL("&H"+a$))
  566.     READ a$
  567.   WEND
  568.   llpoke:
  569.   DATA 206F,0006,5848,2A58,2C58,2E18,4285,7C50,046F,0004,0004,6704,2C18
  570.   DATA 2A18,3F3C,0002,4E4E,544F,2200,0681,0000,7D00,DBC0,5347,B28D,651E
  571.   DATA BBC0,651A,241E,4A45,670A,6B04,EBAA,6004,3805,EAAA,8495,2A82,DBC6
  572.   DATA 51CF,FFE0,4E75,*
  573. RETURN
  574. '
  575. PROCEDURE initedit
  576.   DIM t$(2,80)            ! wird normalerweise nur bis 40 gebraucht
  577.   DIM yedit%(2),triole!(2,80)
  578.   maxokt%=5
  579.   lrand%=14
  580.   rrand%=78
  581.   abst%=80
  582.   abst%=3*(abst% DIV 3)
  583.   yedit%(0)=120
  584.   yedit%(1)=yedit%(0)+abst%
  585.   yedit%(2)=yedit%(1)+abst%
  586.   grenz0%=yedit%(0)-35
  587.   grenz1%=yedit%(0)+abst%/2+12
  588.   grenz2%=grenz1%+abst%
  589.   grenz3%=grenz2%+abst%
  590. RETURN
  591. '
  592. PROCEDURE eraeditfeld
  593.   ERASE t$()
  594.   DIM t$(2,80)
  595. RETURN
  596. '
  597. PROCEDURE initmouse
  598.   LOCAL i%,j%
  599.   DIM mouse$(25)
  600.   RESTORE mmousedat
  601.   FOR i%=0 TO 25
  602.     LET mouse$(i%)=MKI$(6)+MKI$(11)+MKI$(1)
  603.     LET mouse$(i%)=mouse$(i%)+MKI$(0)+MKI$(1)
  604.     FOR j%=1 TO 16
  605.       READ hinten%
  606.       LET mouse$(i%)=mouse$(i%)+MKI$(hinten%)
  607.     NEXT j%
  608.     FOR j%=1 TO 16
  609.       READ vorn%
  610.       LET mouse$(i%)=mouse$(i%)+MKI$(vorn%)
  611.     NEXT j%
  612.   NEXT i%
  613.   '
  614.   mmousedat:
  615.   DATA 240,136,132,146,137,133,145,137,3973,4241,8201,16389,16401,8233,4165,3970
  616.   DATA 0,112,120,108,118,122,110,118,122,3950,8182,16378,16366,8134,3970,0
  617.   DATA 960,544,528,584,548,532,580,548,15892,16964,32804,23,68,32932,16663,15880
  618.   DATA 0,448,480,432,472,488,440,472,488,15800,32728,65512,65467,32539,15880,0
  619.   DATA 240,136,132,146,137,133,145,137,3973,4241,8217,16405,16405,8226,4160,3968
  620.   DATA 0,112,120,108,118,122,110,118,122,3950,8166,16354,16354,8128,3968,0
  621.   DATA 240,136,132,146,137,133,145,137,3973,4241,8217,16413,16403,8242,4172,3968
  622.   DATA 0,112,120,108,118,122,110,118,122,3950,8166,16354,16364,8140,3968,0
  623.   DATA 240,136,132,146,137,133,145,153,3989,4245,8210,16400,16400,8224,4160,3968
  624.   DATA 0,112,120,108,118,122,110,102,98,3938,8160,16352,16352,8128,3968,0
  625.   DATA 240,136,132,146,137,133,145,153,3989,4245,8210,16406,16409,8233,4166,3968
  626.   DATA 0,112,120,108,118,122,110,102,98,3938,8160,16352,16358,8134,3968,0
  627.   DATA 240,136,132,146,153,149,149,149,3986,4240,8208,16400,16384,8224,4160,3968
  628.   DATA 0,112,120,108,102,98,98,98,96,3936,8160,16352,16352,8128,3968,0
  629.   DATA 240,136,132,146,153,149,149,149,3986,4240,8208,16406,16409,8233,4166,3968
  630.   DATA 0,112,120,108,102,98,98,98,96,3936,8160,16352,16358,8134,3968,0
  631.   DATA 240,144,144,144,144,144,144,144,3984,4112,8208,16400,16400,8224,4160,3968
  632.   DATA 0,96,96,96,96,96,96,96,96,3936,8160,16352,16352,8128,3968,0
  633.   DATA 240,144,144,144,144,144,144,144,3984,4240,8214,16409,16409,8230,4160,3968
  634.   DATA 0,96,96,96,96,96,96,96,96,3936,8160,16358,16358,8128,3968,0
  635.   DATA 240,144,144,144,144,144,144,144,3984,4240,8208,20368,20368,8224,4160,3968
  636.   DATA 0,96,96,96,96,96,96,96,96,3936,8160,12384,12384,8128,3968,0
  637.   DATA 240,144,144,144,144,144,144,144,3984,4240,8214,20377,20377,8230,4160,3968
  638.   DATA 0,96,96,96,96,96,96,96,96,3936,8160,12390,12390,8128,3968,0
  639.   DATA 0,0,0,0,0,0,0,0,3968,4160,8224,20368,20368,8224,4160,3968
  640.   DATA 0,0,0,0,0,0,0,0,0,3968,8128,12384,12384,8128,3968,0
  641.   DATA 0,0,0,0,0,0,0,0,3968,4160,8230,20377,20377,8230,4160,3968
  642.   DATA 0,0,0,0,0,0,0,0,0,3968,8128,12390,12390,8128,3968,0
  643.   ' pausen:
  644.   ' 1/32 pause
  645.   DATA 1172,2132,2132,1252,1544,2536,4328,4296,2512,3600,5072,8592,8608,5024,3104,832
  646.   DATA 776,1928,1928,792,496,1552,3856,3888,1568,480,3104,7776,7744,3136,960,128
  647.   ' 1/32 punkt.pause
  648.   DATA 4688,8528,8528,5015,6184,10152,17320,17191,10048,14400,20288,34368,34432,20096,12416,3328
  649.   DATA 3104,7712,7712,3168,1991,6215,15431,15552,6272,1920,12416,31104,30976,12544,3840,512
  650.   ' 1/16 pause
  651.   DATA 3104,4688,8528,8528,5008,6176,10144,17312,17184,10048,6208,1856,576,640,640,640
  652.   DATA 0,3104,7712,7712,3168,1984,6208,15424,15552,6272,1920,128,384,256,256,256
  653.   ' 1/16 punkt.pause
  654.   DATA 9376,17056,17070,10033,12369,20305,34638,34368,20096,12416,3712,1152,1280,1280,1280,1280
  655.   DATA 6208,15424,15424,6350,3982,12430,30848,31104,12544,3840,256,768,512,512,512,512
  656.   ' 1/8 pause
  657.   DATA 0,0,0,3104,4688,8528,8592,8992,9888,4512,3872,320,320,576,640,640
  658.   DATA 0,0,0,0,3104,7712,7776,7360,6464,3648,192,128,128,384,256,256
  659.   ' 1/8 punkt.pause
  660.   DATA 0,0,0,6208,9390,17073,17201,18001,19790,9024,7744,640,640,1152,1280,1280
  661.   DATA 0,0,0,0,6208,15438,15566,14734,12928,7296,384,256,256,768,512,512
  662.   ' 1/4 pause
  663.   DATA 6144,5120,2560,1280,640,576,1088,2176,1280,640,832,1056,2240,2304,1280,640
  664.   DATA 0,2048,1024,512,256,384,896,1792,512,256,128,960,1792,1536,512,256
  665.   ' 1/4 punkt.pause
  666.   DATA 6144,5120,2560,1280,654,593,1105,2193,1294,640,832,1056,2240,2304,1280,640
  667.   DATA 0,2048,1024,512,256,398,910,1806,512,256,128,960,1792,1536,512,256
  668.   ' b-Vorz.
  669.   DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  670.   DATA 128,128,128,128,128,128,176,200,136,136,144,160,192,128,0,0
  671.   ' #-Vorz.
  672.   DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  673.   DATA 8,8,72,72,76,88,104,200,72,76,88,104,200,72,64,64
  674.   ' Auflösungszeichen
  675.   DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  676.   DATA 64,64,64,76,124,116,68,68,68,92,124,100,4,4,4,0
  677.   '
  678.   DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  679.   DATA 0,0,0,0,0,0,62,63,3,3,14,14,3,51,63,30
  680.   '
  681. RETURN
  682. PROCEDURE initplot
  683.   DIM laenge%(2,64),hhals%(2,64),vorz%(2,64),sep!(2,64),x%(2,64),y%(2,64),count%(2)
  684.   DIM vorzplot%(2,15),vorz$(3)
  685.   RESTORE vorz
  686.   FOR i%=0 TO 3
  687.     READ vorz$(i%)
  688.   NEXT i%
  689.   vorz:
  690.   DATA "",b,#,§
  691.   RESTORE vorzplot
  692.   FOR j%=0 TO 2
  693.     FOR i%=0 TO 15
  694.       READ vorzplot%(j%,i%)
  695.     NEXT i%
  696.   NEXT j%
  697.   vorzplot:
  698.   ' b-Vorz.
  699.   DATA 128,128,128,128,128,128,176,200,136,136,144,160,192,128,0,0
  700.   ' #-Vorz.
  701.   DATA 8,8,72,72,76,88,104,200,72,76,88,104,200,72,64,64
  702.   ' Auflösungszeichen
  703.   DATA 64,64,64,76,124,116,68,68,68,92,124,100,4,4,4,0
  704.   '
  705.   DIM c%(2),schluessel%(50)
  706.   RESTORE schluessel
  707.   FOR i%=0 TO 49
  708.     READ schluessel%(i%)
  709.   NEXT i%
  710.   RESTORE kopfdat
  711.   DIM kopf%(1,4)
  712.   FOR i%=0 TO 1
  713.     FOR j%=0 TO 4
  714.       READ kopf%(i%,j%)
  715.     NEXT j%
  716.   NEXT i%
  717.   kopfdat:
  718.   DATA 126,195,129,195,126
  719.   DATA 126,255,255,255,126
  720.   '
  721.   RESTORE ppausendat
  722.   DIM pausen%(11,15)
  723.   FOR i%=0 TO 7
  724.     FOR j%=0 TO 15
  725.       READ temp%
  726.       LET pausen%(i%,j%)=temp%
  727.     NEXT j%
  728.   NEXT i%
  729.   ppausendat:
  730.   DATA 776,1928,1928,792,496,1552,3856,3888,1568,480,3104,7776,7744,3136,960,128
  731.   DATA 3104,7712,7712,3168,1991,6215,15431,15552,6272,1920,12416,31104,30976,12544,3840,512
  732.   DATA 0,3104,7712,7712,3168,1984,6208,15424,15552,6272,1920,128,384,256,256,256
  733.   DATA 6208,15424,15424,6350,3982,12430,30848,31104,12544,3840,256,768,512,512,512,512
  734.   DATA 0,0,0,0,3104,7712,7776,7360,6464,3648,192,128,128,384,256,256
  735.   DATA 0,0,0,0,6208,15438,15566,14734,12928,7296,384,256,256,768,512,512
  736.   DATA 0,2048,1024,512,256,384,896,1792,512,256,128,960,1792,1536,512,256
  737.   DATA 0,2048,1024,512,256,398,910,1806,512,256,128,960,1792,1536,512,256
  738.   '
  739.   RESTORE halsdat
  740.   DIM hals%(21,6,1)
  741.   FOR i%=0 TO 3
  742.     FOR j%=21 DOWNTO 0
  743.       READ temp%
  744.       hals%(j%,i%,0)=temp%
  745.       IF j%<=18
  746.         hals%(j%+3,i%,1)=temp%*512
  747.       ELSE
  748.         hals%(j%-19,i%,1)=128*512
  749.       ENDIF
  750.     NEXT j%
  751.   NEXT i%
  752.   FOR j%=0 TO 15
  753.     hals%(j%,4,0)=128
  754.     hals%(j%,5,0)=128
  755.     hals%(j%,4,1)=128*512
  756.     hals%(j%,5,1)=128*512
  757.   NEXT j%
  758.   halsdat:
  759.   DATA 224,240,184,220,236,246,186,222,238,246,186,222,238,246,186,158,142,134,130,130,132,128
  760.   DATA 0,128,192,224,240,184,220,238,246,186,222,238,246,186,158,142,134,130,130,132,128,128
  761.   DATA 0,0,0,0,0,128,128,192,224,240,184,220,238,246,186,158,142,134,130,130,132,128
  762.   DATA 0,0,0,0,0,0,0,0,128,128,192,224,240,184,156,142,134,130,130,132,128,128
  763.   '
  764.   RESTORE notenbezeichner
  765.   DIM noten$(7)
  766.   FOR i%=0 TO 7
  767.     READ noten$(i%)
  768.   NEXT i%
  769.   notenbezeichner:
  770.   DATA C,D,E,F,G,A,H,C
  771. RETURN
  772. '
  773. PROCEDURE plotnote(laenge%,hals%,sep!,x%,y%,vorz$)
  774.   ' Erklärung der Parameter:
  775.   ' laenge% = Notendauer von 0 bis 12
  776.   ' hals%   = Länge des Notenhalses ( >0 => nach oben; <0 => nach unten )
  777.   ' sep!    = Note einzeln setzen (ohne gemeinsame Achtel-balken)
  778.   '           das Vorzeichen von Hals% gibt an, ob Hals nach oben oder unten.
  779.   ' x%,y%   = Position der Note (y% in Pixelreihen, x% in Byte-spalten.).
  780.   ' vorz$   = # oder b oder §
  781.   LOCAL i%,bildadr%,temp%,zwi%,shift!,bild%
  782.   HIDEM
  783.   bild%=XBIOS(2)+1520
  784.   IF x%>=80
  785.     ALERT 3,"ERROR in PROCEDUR plotnote !|Nicht über Bildschirmrand|hinaus plotten!|( x = "+STR$(x%)+" )",1,"  Stop  ",dummy
  786.     ERROR 100
  787.   ENDIF
  788.   IF ODD(x%)
  789.     ALERT 3,"ERROR in PROCEDURE plotnote !|Plotten von Note nur an|gerade Bildschirm-Adresse!|( x = "+STR$(x%)+" )",1,"  Stop  ",dummy%
  790.     ERROR 100
  791.   ENDIF
  792.   temp%=(y%-3)*80+x%
  793.   IF temp%>32000 OR temp%<0
  794.     ALERT 3,"ERROR in PROCEDURE plotnote !|Versuch außerhalb des |Bildschirms zu poken!|( XBIOS(2)+"+STR$(temp%)+" )",1,"  Stop  ",dummy
  795.     ERROR 100
  796.   ENDIF
  797.   bildadr%=bild%+temp%
  798.   shift!=(PEEK(bildadr%)<>0) OR (PEEK(bildadr%+320)<>0)
  799.   IF laenge%<14
  800.     kopf%=-(laenge%<10)                     ! 10 bis 12 => ganze und halbe Noten
  801.     SUB bildadr%,shift!
  802.     zwi%=bildadr%
  803.     IF vorz$<>""
  804.       @plotvorz(x%,y%,-(vorz$="#")-2*(vorz$="§"))
  805.     ENDIF
  806.     FOR i%=0 TO 4
  807.       IF bildadr%-bild%>30480 OR bildadr%-bild%<0
  808.         ALERT 3,"ERROR in PROCEDURE plotnote !|Versuch außerhalb des |Bildschirms zu poken!|( "+STR$(bildadr%)+" )",1,"  Stop  ",dummy
  809.         ERROR 100
  810.       ENDIF
  811.       POKE bildadr%,kopf%(kopf%,i%) OR PEEK(bildadr%)
  812.       ADD bildadr%,80
  813.     NEXT i%
  814.     IF ODD(laenge%)                        ! => punktierte Note
  815.       bildadr%=zwi%+1
  816.       FOR i%=0 TO 2
  817.         ADD bildadr%,80
  818.         IF bildadr%-bild%>30480 OR bildadr%-bild%<0
  819.           ALERT 3,"ERROR in PROCEDURE plotnote !|Versuch außerhalb des |Bildschirms zu poken!|( "+STR$(bildadr%)+" )",1,"  Stop  ",dummy
  820.           ERROR 100
  821.         ENDIF
  822.         POKE bildadr%,&X111000 OR PEEK(bildadr%)
  823.       NEXT i%
  824.     ENDIF
  825.     IF laenge%<12
  826.       IF laenge%>13
  827.         sep!=TRUE
  828.       ENDIF
  829.       bildadr%=zwi%+158+shift!
  830.       IF hals%>0
  831.         d%=-80
  832.       ELSE
  833.         d%=80
  834.       ENDIF
  835.       IF sep!
  836.         LET lpoke%=VARPTR(lpoke$)
  837.         b%=(bildadr%-bild%)-shift!*2+1520
  838.         v%=VARPTR(hals%(0,INT(laenge%/2),-(hals%<0)))
  839.         CALL lpoke%(b%,v%,21,d%,-8*shift!,0)
  840.       ELSE
  841.         IF hals%>0
  842.           temp%=&H80
  843.         ELSE
  844.           temp%=&H10000
  845.         ENDIF
  846.         FOR i%=0 TO hals% STEP SGN(hals%)
  847.           IF bildadr%-bild%>30480 OR bildadr%-bild%<0
  848.             ALERT 3,"ERROR in PROCEDURE plotnote !|Versuch außerhalb des |Bildschirms zu poken!|( "+STR$(bildadr%)+" )",1,"  Stop  ",dummy
  849.             ERROR 100
  850.           ENDIF
  851.           LPOKE bildadr%,temp% OR LPEEK(bildadr%)
  852.           ADD bildadr%,d%
  853.         NEXT i%
  854.       ENDIF
  855.     ENDIF
  856.   ELSE
  857.     FOR i%=0 TO 15
  858.       IF bildadr%-bild%>30480 OR bildadr%-bild%<0
  859.         ALERT 3,"ERROR in PROCEDURE plotnote !|Versuch außerhalb des |Bildschirms zu poken!|( "+STR$(bildadr%)+" )",1,"  Stop  ",dummy
  860.         ERROR 100
  861.       ENDIF
  862.       IF NOT shift!
  863.         DPOKE bildadr%,DPEEK(bildadr%) OR pausen%(laenge%-14,i%)
  864.       ELSE
  865.         LPOKE bildadr%,LPEEK(bildadr%) OR 256*pausen%(laenge%-14,i%)
  866.       ENDIF
  867.       ADD bildadr%,80
  868.     NEXT i%
  869.   ENDIF
  870. RETURN
  871. '
  872. PROCEDURE hilfszeilen(y1%,x%,y%)
  873.   LOCAL i%
  874.   ADD y%,y1%
  875.   i%=y1%+30
  876.   WHILE i%<y%
  877.     LINE x%*8-2,i%,x%*8+10,i%
  878.     ADD i%,6
  879.   WEND
  880.   i%=y1%
  881.   WHILE i%>y%-2
  882.     LINE x%*8-2,i%,x%*8+10,i%
  883.     SUB i%,6
  884.   WEND
  885. RETURN
  886. '
  887. PROCEDURE select_file(a$)
  888.   LOCAL i%,inp%,newname$
  889.   IF INSTR(name$,".")<>0
  890.     LET name$=LEFT$(name$,INSTR(name$,"."))+a$
  891.   ENDIF
  892.   FILESELECT pfad$+"*."+a$,name$,newname$
  893.   i%=LEN(newname$)
  894.   IF i%
  895.     LET name$=newname$
  896.     WHILE MID$(name$,i%,1)<>"\"
  897.       DEC i%
  898.     WEND
  899.     pfad$=LEFT$(name$,i%)
  900.     LET name$=MID$(name$,i%+1)
  901.     IF INSTR(name$,".")=0
  902.       LET name$=name$+"."+a$
  903.     ENDIF
  904.   ENDIF
  905.   sel!=i%>0
  906. RETURN
  907. '
  908. PROCEDURE open_file(voll_name$)
  909.   @select_file("MUS")
  910.   IF sel!
  911.     OPEN "R",#0,pfad$+name$
  912.   ENDIF
  913. RETURN
  914. '
  915. PROCEDURE read_file
  916.   LOCAL i%,load$,temp%,p%,pa%
  917.   @select_file("MUS")
  918.   IF sel! AND EXIST(pfad$+name$)
  919.     LET load$=STRING$(32760,CHR$(0))
  920.     BLOAD pfad$+name$,VARPTR(load$)
  921.     ERASE takte$()
  922.     DIM takte$(2,1000)
  923.     pa%=1
  924.     FOR j%=0 TO 1000
  925.       FOR i%=0 TO 2
  926.         p%=INSTR(load$,"|",pa%)
  927.         EXIT IF p%=0
  928.         takte$(i%,j%)=MID$(load$,pa%,p%-pa%+1)
  929.         pa%=p%+3
  930.       NEXT i%
  931.       EXIT IF p%=0
  932.     NEXT j%
  933.     filep%=j%
  934.     maxfilep%=j%
  935.     CLR edflag!
  936.     CLR compileflag!
  937.     @clear_vorz
  938.   ENDIF
  939. RETURN
  940. '
  941. PROCEDURE merge_file
  942.   LOCAL i%,screen$,temp%,k%,temp$,j%,n%
  943.   ALERT 2,"Das File wird vor dem|aktuellen Takt eingefügt!| ",1,"   Ok   |Abbruch",temp%
  944.   IF temp%=1
  945.     @open_file(pfad$+name$)
  946.     IF sel!
  947.       j%=filep%
  948.       SGET screen$
  949.       CLOSEW 0
  950.       CLS
  951.       PRINT "Inserting file: ";pfad$;name$
  952.       PRINT
  953.       PRINT
  954.       k%=NOT 0
  955.       WHILE NOT EOF(#0)
  956.         IF k%
  957.           PRINT
  958.         ENDIF
  959.         CLR temp%
  960.         FOR i%=0 TO 2
  961.           LINE INPUT #0;takt$(i%)
  962.           IF k%
  963.             PRINT takt$(i%)
  964.           ENDIF
  965.           ADD temp%,LEN(takt$(i%))
  966.           '
  967.         NEXT i%
  968.         IF temp%
  969.           @insert
  970.         ENDIF
  971.         IF MOUSEK
  972.           k%=NOT k%
  973.           REPEAT
  974.           UNTIL MOUSEK=0
  975.         ENDIF
  976.       WEND
  977.       REPEAT
  978.       UNTIL MOUSEK OR INKEY$<>"" OR k%=0
  979.       CLR compileflag!
  980.       OPENW 0
  981.       SPUT screen$
  982.       CLR screen$
  983.       CLOSE
  984.     ENDIF
  985.   ENDIF
  986. RETURN
  987. '
  988. PROCEDURE write_part
  989.   LOCAL i%,screen$,inp$
  990.   SGET screen$
  991.   PRINT AT(1,4);"Abspeichern von aktuellem Takt bis einschließlich (maximal ";
  992.   PRINT maxfilep%-1;") ";
  993.   INPUT inp$
  994.   IF inp$<>"" AND VAL(inp$)>=filep%
  995.     CLR name$
  996.     @write_file(filep%,MIN(maxfilep%-1,VAL(inp$)))
  997.   ENDIF
  998.   SPUT screen$
  999.   CLR screen$
  1000. RETURN
  1001. '
  1002. PROCEDURE write_file(von%,bis%)
  1003.   LOCAL i%,j%
  1004.   @select_file("MUS")
  1005.   IF sel!
  1006.     IF EXIST(pfad$+name$)
  1007.       KILL pfad$+name$
  1008.     ENDIF
  1009.     OPEN "R",#0,pfad$+name$
  1010.     FOR j%=von% TO bis%
  1011.       FOR i%=0 TO 2
  1012.         PRINT AT(1,3);"Writing Takt ";j%,,
  1013.         PRINT #0;takte$(i%,j%)
  1014.       NEXT i%
  1015.     NEXT j%
  1016.     CLOSE
  1017.   ENDIF
  1018. RETURN
  1019. '
  1020. PROCEDURE initcomp
  1021.   transpose=1
  1022.   tempo=1
  1023.   gap%=2
  1024.   DIM nd%(2),compt$(2),vorzeichen$(7)
  1025.   DIM nnote%(23)
  1026.   RESTORE periodendauer
  1027.   FOR i%=0 TO 23
  1028.     READ nnote%(i%)
  1029.   NEXT i%
  1030.   periodendauer:
  1031.   '
  1032.   ' Diese Periodenlängen entsprechen den Kehrwerten der Frequenzen, die in
  1033.   ' SPECTRUM DER WISSENSCHAFT 7/1987 Seite 8 abgedruckt sind.
  1034.   ' Sie sind auf Kammerton a = 440.0 Hz getrimmt.
  1035.   '
  1036.   DATA 2273,2025,3823,3405,3034,2864,2551,2025
  1037.   '      A    H    C    D    E    F    G    H
  1038.   DATA 2145,1911,3608,3214,2864,2703,2408,1911
  1039.   '     #A  #H    #C   #D   #E   #F   #G   #H
  1040.   DATA 2419,2145,4049,3608,3214,3034,2703,2145
  1041.   '     bA   bH   bC   bD   bE   bF   bG   bH
  1042.   '
  1043.   ' Diese Periodenlängen sind selbst errechnet, so daß das Produkt einer Note
  1044.   ' mit einem bestimmten Faktor die nächste Note ergibt, wobei sich nach zwölf
  1045.   ' Iterationen genau die halbe Periodendauer ergibt.
  1046.   ' Der Faktor ist 2^(1/12). Nach demselben Algorithmus wurden auch die
  1047.   ' Frequenzen in SPEKTRUM DER WISSENSCHAFT berechnet.
  1048.   ' Kammerton a = 438.0 Hz.
  1049.   '
  1050.   '  DATA 2283,2034,3840,3421,3048,2877,2563,2034
  1051.   '      A    H    C    D    E    F    G    H
  1052.   '  DATA 2155,1920,3624,3229,2877,2715,2419,1920
  1053.   '     #A  #H    #C   #D   #E   #F   #G   #H
  1054.   '  DATA 2419,2155,4068,3624,3229,3048,2715,2155
  1055.   '     bA   bH   bC   bD   bE   bF   bG   bH
  1056.   '
  1057.   '
  1058. RETURN
  1059. '
  1060. PROCEDURE set_glob_vorz
  1061.   LOCAL i%
  1062.   @clear_vorz
  1063.   CLR i%
  1064.   REPEAT
  1065.     IF vorzeichen$(ASC(takt$(0))-97)=""
  1066.       vorzeichen$(ASC(takt$(0))-97)=MID$(takt$(0),2,1)
  1067.       t$(0,i%)=LEFT$(takt$(0),2)
  1068.     ENDIF
  1069.     takt$(0)=MID$(takt$(0),3)
  1070.     INC i%
  1071.   UNTIL LEFT$(takt$(0))<"a" OR LEFT$(takt$(0))>"h"
  1072.   vorzeichen$(1)=vorzeichen$(7)
  1073.   CLR vorzeichen$
  1074.   FOR i%=0 TO 7
  1075.     IF vorzeichen$(i%)<>""
  1076.       vorzeichen$=vorzeichen$+vorzeichen$(i%)
  1077.     ELSE
  1078.       vorzeichen$=vorzeichen$+" "
  1079.     ENDIF
  1080.   NEXT i%
  1081.   IF INSTR(vorzeichen$,"§")
  1082.     vorzeichen$="01234567"
  1083.   ENDIF
  1084. RETURN
  1085. '
  1086. PROCEDURE clear_vorz
  1087.   LOCAL i%
  1088.   FOR i%=0 TO 7
  1089.     vorzeichen$(i%)=""
  1090.   NEXT i%
  1091.   vorzeichen$="01234567"
  1092. RETURN
  1093. '
  1094. PROCEDURE comptakt(rueck%)
  1095.   LOCAL compilat$,i%,j%,n%,temp$
  1096.   LOCAL meld%,len%
  1097.   compilat$=STRING$(1025,CHR$(0))
  1098.   compt$(0)=takt$(0)
  1099.   compt$(1)=takt$(1)
  1100.   compt$(2)=takt$(2)
  1101.   IF LEFT$(takt$(0))>="a" AND LEFT$(takt$(0))<="h" AND LEFT$(takt$(0))<>"b"
  1102.     @set_glob_vorz
  1103.   ENDIF
  1104.   SWAP compt$(0),takt$(0)
  1105.   IF (INSTR(compt$(0),"|")>0) AND (INSTR(compt$(1),"|")>0) AND (INSTR(compt$(2),"|")>0)
  1106.     VOID FRE(8)
  1107.     len%=256
  1108.     meld%=0
  1109.     cmc%=VARPTR(cmc$)
  1110.     CALL cmc%(compt$(0),compt$(1),compt$(2),VARPTR(volume%(0)),vorzeichen$,VARPTR(nnote%(0)),transpose*256,gap%,tempo*256,compilat$,VARPTR(len%),VARPTR(nd%(0)),VARPTR(meld%),0)
  1111.     compileerror!=meld%
  1112.     IF meld%=1
  1113.       err$="chan0: "+STR$(nd%(0))+"|chan1: "+STR$(nd%(1))+"|chan2: "+STR$(nd%(2))
  1114.       ALERT 3,"Fehler bei der Taktlänge !|"+err$,1,"   OK   ",temp%
  1115.     ENDIF
  1116.     IF meld%=2
  1117.       ALERT 3,"Fehler bei der Tonhöhe:|"+takt$(0)+takt$(1)+takt$(2),1,"   OK   ",temp%
  1118.     ENDIF
  1119.     *rueck%=LEFT$(compilat$,len%)
  1120.   ELSE
  1121.     *rueck%=""
  1122.   ENDIF
  1123. RETURN
  1124. '
  1125. PROCEDURE initmenu
  1126.   DIM grundmenue$(70)
  1127.   RESTORE grundmenue
  1128.   FOR i%=0 TO 70
  1129.     READ grundmenue$(i%)
  1130.     IF grundmenue$(i%)="***Key klick"
  1131.       IF PEEK(&H484) AND 1       ! Key-klick ist an.
  1132.         grundmenue$(i%)="Key klick off"
  1133.       ELSE
  1134.         grundmenue$(i%)="Key klick on"
  1135.       ENDIF
  1136.     ENDIF
  1137.     EXIT IF grundmenue$(i%)="***"
  1138.     IF LEFT$(grundmenue$(i%))<>"-" AND grundmenue$(i%)<>""
  1139.       grundmenue$(i%)="  "+grundmenue$(i%)
  1140.     ENDIF
  1141.   NEXT i%
  1142.   grundmenue$(i%)=""
  1143.   grundmenue$(i%+1)=""
  1144.   grundmenue:
  1145.   DATA Desk  ,Music Writer
  1146.   DATA ----------------------,1,2,3,4,5,6,""
  1147.   DATA File  ,Clear,Write,Write Part,---------------
  1148.   DATA Read,Merge,---------------,Quit,---------------,Delete File,""
  1149.   DATA Edit  ,Next,Preceeding,--------------------,Goto nr.
  1150.   DATA Goto first,Goto last,--------------------,Skip Edits,Clear Takt
  1151.   DATA ""
  1152.   DATA Put  ,Put into Buffer,Get from Buffer,-------------------
  1153.   DATA Replace,Insert,-------------------,Skip Edits,Delete aktual,""
  1154.   DATA Actions  ,Compile Takt,Play Takt,--------------------
  1155.   DATA Compile all,Play all,Play from actual
  1156.   DATA --------------------,Double Speed,Half Speed,--------------------
  1157.   DATA Save Sound,Read Sound,""
  1158.   DATA Specials  ,***Key klick,Noten eng
  1159.   DATA -----------------,Volume,Transpose,Tempo,Gap,""
  1160.   DATA ***
  1161. RETURN
  1162. '
  1163. PROCEDURE grundmenue
  1164.   LOCAL m$,i%,inp%,temp$,temp2$
  1165.   m$=UPPER$(grundmenue$(MENU(0)))
  1166.   REPEAT
  1167.     i%=INSTR(m$," ")
  1168.     IF i%
  1169.       m$=LEFT$(m$,i%-1)+MID$(m$,i%+1)
  1170.     ENDIF
  1171.   UNTIL i%=0
  1172.   no_menue!=FALSE
  1173.   neu!=TRUE
  1174.   IF m$="MUSICWRITER"
  1175.     @anleitung
  1176.   ENDIF
  1177.   IF m$="CLEAR"
  1178.     ALERT 2," | Wirklich alles löschen? | ",1,"   Ja   |  nein  ",inp%
  1179.     IF inp%=1
  1180.       ALERT 2," | Ganz hundertprozent sicher ? | ",1,"doch, ja|ach nein",inp%
  1181.       IF inp%=1
  1182.         RUN
  1183.       ENDIF
  1184.     ENDIF
  1185.   ENDIF
  1186.   IF m$="WRITE"
  1187.     @ask
  1188.     @write_file(0,maxfilep%)
  1189.   ENDIF
  1190.   IF m$="WRITEPART"
  1191.     @ask
  1192.     @write_part
  1193.   ENDIF
  1194.   IF m$="READ"
  1195.     @read_file
  1196.     @find_akt_vorz
  1197.   ENDIF
  1198.   IF m$="MERGE"
  1199.     @ask
  1200.     @merge_file
  1201.     @find_akt_vorz
  1202.   ENDIF
  1203.   IF m$="QUIT"
  1204.     ALERT 2,"Haben sie alles gesichert?",2,"  Ende  | Weiter ",inp%
  1205.     IF inp%=1
  1206.       MENU KILL
  1207.       END
  1208.     ENDIF
  1209.   ENDIF
  1210.   IF m$="DELETEFILE"
  1211.     temp$=name$
  1212.     temp2$=pfad$
  1213.     LET name$=""
  1214.     @select_file("*")
  1215.     IF sel! AND name$<>".*"
  1216.       ALERT 3,"Soll ich |"+UPPER$(name$)+"|wirklich löschen?| ",2,"   Ja   |  nein  ",inp%
  1217.       IF inp%=1 AND EXIST(pfad$+name$)
  1218.         KILL pfad$+name$
  1219.       ENDIF
  1220.     ENDIF
  1221.     LET name$=temp$
  1222.     pfad$=temp2$
  1223.   ENDIF
  1224.   IF m$="NEXT"
  1225.     @ask
  1226.     filep%=filep%-(filep%<maxfilep%)
  1227.   ENDIF
  1228.   IF m$="PRECEEDING"
  1229.     @ask
  1230.     filep%=filep%+(filep%>0)
  1231.     @find_akt_vorz
  1232.   ENDIF
  1233.   IF m$="GOTONR."
  1234.     @ask
  1235.     REPEAT
  1236.       PRINT AT(1,4);"Bitte Taktnummer eingeben (0 bis ";maxfilep%;") : ";
  1237.       INPUT temp$
  1238.       IF LEN(temp$)
  1239.         filep%=VAL(temp$)
  1240.       ENDIF
  1241.     UNTIL filep%>=0 AND filep%<=maxfilep%
  1242.     PRINT AT(1,4);SPACE$(80)
  1243.     @find_akt_vorz
  1244.   ENDIF
  1245.   IF m$="GOTOFIRST"
  1246.     @ask
  1247.     @clear_vorz
  1248.     CLR filep%
  1249.   ENDIF
  1250.   IF m$="GOTOLAST"
  1251.     @ask
  1252.     filep%=maxfilep%
  1253.     @find_akt_vorz
  1254.   ENDIF
  1255.   IF m$="CLEARTAKT"
  1256.     @eraeditfeld
  1257.     @put_t_to_taktfeld
  1258.     edflag!=TRUE
  1259.     CLR neu!
  1260.   ENDIF
  1261.   IF m$="DELETEAKTUAL"
  1262.     ALERT 2," |  Wirklich ?  | | ",0,"na klar!|ne,ne !",delinp%
  1263.     IF delinp%=1
  1264.       @delete
  1265.       @find_akt_vorz
  1266.     ELSE
  1267.       neu!=FALSE
  1268.     ENDIF
  1269.   ENDIF
  1270.   IF m$="COMPILEALL"
  1271.     @ask
  1272.     @compile_all(0)
  1273.   ENDIF
  1274.   IF m$="PLAYALL"
  1275.     @ask
  1276.     @play_all(0)
  1277.   ENDIF
  1278.   IF m$="PLAYFROMACTUAL"
  1279.     @ask
  1280.     CLR compileflag!
  1281.     @play_all(filep%)
  1282.   ENDIF
  1283.   IF m$="DOUBLESPEED"
  1284.     @change_speed(-1)
  1285.   ENDIF
  1286.   IF m$="HALFSPEED"
  1287.     @change_speed(1)
  1288.   ENDIF
  1289.   IF m$="READSOUND"
  1290.     neu!=FALSE
  1291.     @read_sound
  1292.   ENDIF
  1293.   IF m$="SAVESOUND"
  1294.     neu!=FALSE
  1295.     @save_sound
  1296.   ENDIF
  1297.   IF m$="PUTINTOBUFFER"
  1298.     neu!=FALSE
  1299.     @put_to_buf
  1300.   ENDIF
  1301.   IF m$="GETFROMBUFFER"
  1302.     @get_from_buf
  1303.   ENDIF
  1304.   IF m$="INSERT"
  1305.     @put_t_to_taktfeld
  1306.     @insert
  1307.   ENDIF
  1308.   IF m$="REPLACE"
  1309.     @put_t_to_taktfeld
  1310.     @replace
  1311.   ENDIF
  1312.   IF m$="SKIPEDITS"
  1313.     @skip
  1314.     CLR edflag!
  1315.   ENDIF
  1316.   IF m$="COMPILETAKT"
  1317.     @put_t_to_taktfeld
  1318.     @comptakt(*taktsound$)
  1319.     neu!=FALSE
  1320.   ENDIF
  1321.   IF m$="PLAYTAKT"
  1322.     @put_t_to_taktfeld
  1323.     @play_takt
  1324.   ENDIF
  1325.   IF m$="VOLUME"
  1326.     @volume
  1327.     neu!=FALSE
  1328.     CLR compileflag!
  1329.   ENDIF
  1330.   IF m$="KEYKLICKON"
  1331.     grundmenue$(MENU(0))="  Keyklick off  "
  1332.     MENU grundmenue$()
  1333.     ' klick on
  1334.     SPOKE &H484,PEEK(&H484) OR 5
  1335.     neu!=FALSE
  1336.     @disable
  1337.   ENDIF
  1338.   IF m$="KEYKLICKOFF"
  1339.     grundmenue$(MENU(0))="  Keyklick on  "
  1340.     MENU grundmenue$()
  1341.     SPOKE &H484,PEEK(&H484) AND NOT 5
  1342.     neu!=FALSE
  1343.     @disable
  1344.   ENDIF
  1345.   IF m$="NOTENENG"
  1346.     grundmenue$(MENU(0))="  Noten weit  "
  1347.     @put_t_to_taktfeld
  1348.     MENU grundmenue$()
  1349.     neu!=FALSE
  1350.     dist%=2
  1351.   ENDIF
  1352.   IF m$="NOTENWEIT"
  1353.     grundmenue$(MENU(0))="  Noten eng  "
  1354.     @put_t_to_taktfeld
  1355.     MENU grundmenue$()
  1356.     neu!=FALSE
  1357.     dist%=4
  1358.   ENDIF
  1359.   IF m$="TRANSPOSE"
  1360.     neu!=FALSE
  1361.     @transpose
  1362.   ENDIF
  1363.   IF m$="TEMPO"
  1364.     neu!=FALSE
  1365.     @tempo
  1366.   ENDIF
  1367.   IF m$="GAP"
  1368.     neu!=FALSE
  1369.     @gap
  1370.   ENDIF
  1371.   MENU OFF
  1372. RETURN
  1373. '
  1374. PROCEDURE play_takt
  1375.   @comptakt(*taktsound$)
  1376.   LET temp$=CHR$(7)+CHR$(56)
  1377.   FOR i%=0 TO 2
  1378.     temp$=temp$+CHR$(i%+8)+CHR$(volume%(i%))
  1379.   NEXT i%
  1380.   LET taktsound$=temp$+taktsound$+CHR$(255)+CHR$(0)
  1381.   VOID XBIOS(32,L:VARPTR(taktsound$))
  1382.   neu!=FALSE
  1383. RETURN
  1384. '
  1385. PROCEDURE transpose
  1386.   LOCAL screen$,inp%,inp$,h%,sound$,okt%,step,i%,temp$,temp%
  1387.   ALERT 2," |Explizite Eingabe oder Tunen?| ",1,"Explizit|Tuning|Abbruch",inp%
  1388.   SGET screen$
  1389.   IF inp%=1
  1390.     PBOX 8,0,631,60
  1391.     BOX 8,0,631,60
  1392.     PRINT AT(3,1);"1000 ist normal."''
  1393.     PRINT "2000 ist eine Oktave tiefer ; 500 ist eine Oktave höher"
  1394.     PRINT AT(3,3);"Bitte Transpose eingeben! ";transpose*1000''
  1395.     INPUT temp$
  1396.     IF LEN(temp$)
  1397.       transpose=VAL(temp$)/1000
  1398.     ENDIF
  1399.   ENDIF
  1400.   IF inp%=2
  1401.     temp%=volume%(0)
  1402.     volume%(0)=13
  1403.     PBOX 8,0,631,200
  1404.     BOX 8,0,631,200
  1405.     REPEAT
  1406.       REPEAT
  1407.         PRINT AT(3,1);"Auf welchen Ton? (zB: C oder #C)"'''
  1408.         INPUT inp$
  1409.       UNTIL LEN(inp$)<=2
  1410.       inp$=UPPER$(inp$)
  1411.       IF RIGHT$(inp$)="B"
  1412.         inp$="#H"
  1413.       ENDIF
  1414.       FOR h%=0 TO 7
  1415.         EXIT IF RIGHT$(inp$)=noten$(h%)
  1416.       NEXT h%
  1417.     UNTIL h%<7 OR inp$=""
  1418.     IF h%<7 AND inp$<>""
  1419.       SWAP tsave$(),takt$()
  1420.       takt$(2)="PP3|"
  1421.       takt$(1)=takt$(2)
  1422.       PRINT AT(3,2);"Oktave (zB: 3)"'''
  1423.       INPUT temp$
  1424.       okt%=VAL(temp$)
  1425.       takt$(0)=inp$+STR$(okt%)+"3|"
  1426.       step=0.001
  1427.       PRINT AT(3,4);"Drücken der linken  Maustaste erhöht den Ton."
  1428.       PRINT AT(3,5);"    ""      rechten     ""    erniedrigt """
  1429.       PRINT AT(3,6);"Mit der + bzw - Taste kann die Schrittweite verändert werden."
  1430.       PRINT AT(3,7);"Zurück mit < ENTER >"
  1431.       HIDEM
  1432.       REPEAT
  1433.         ADD transpose,step*((MOUSEK=1)-(MOUSEK=2))
  1434.         transpose=MIN(8.574,MAX(0,transpose))
  1435.         PRINT AT(16,10);"Transpose:    ";1000*MIN(0.001,step)*INT(transpose/MIN(0.001,step));"            "
  1436.         PRINT AT(16,11);"Schrittweite: ";step*1000'''
  1437.         @play_takt
  1438.         i$=INKEY$
  1439.         IF i$="+"
  1440.           step=MIN(1,step*10)
  1441.         ENDIF
  1442.         IF i$="-"
  1443.           step=MAX(1.0E-06,step/10)
  1444.         ENDIF
  1445.       UNTIL i$=CHR$(13)
  1446.       SWAP takt$(),tsave$()
  1447.     ENDIF
  1448.     SHOWM
  1449.     volume%(0)=temp%
  1450.   ENDIF
  1451.   SPUT screen$
  1452.   CLR screen$
  1453.   CLR compileflag!
  1454. RETURN
  1455. '
  1456. PROCEDURE tempo
  1457.   LOCAL screen$,temp$
  1458.   SGET screen$
  1459.   PBOX 8,0,631,60
  1460.   BOX 8,0,631,60
  1461.   PRINT AT(3,1);"1000 ist normal;  ";
  1462.   PRINT "> 1000: langsamer / < 1000: schneller"
  1463.   PRINT AT(10,2);"{ Möglichst 'glatte' Werte wählen!  ( zB: 750 ) }"
  1464.   PRINT AT(3,3);"Bitte Tempo eingeben! ";tempo*1000''
  1465.   INPUT temp$
  1466.   IF LEN(temp$)
  1467.     tempo=VAL(temp$)/1000
  1468.   ENDIF
  1469.   SPUT screen$
  1470.   CLR screen$
  1471.   CLR compileflag!
  1472. RETURN
  1473. '
  1474. PROCEDURE gap
  1475.   LOCAL inp%
  1476.   REPEAT
  1477.     ALERT 0,"Gap bedeutet die Lücke|zwischen unverbundenen Tönen.|Momentan haben wir: "+STR$(gap%),0," länger |  OK  | kürzer ",inp%
  1478.     ADD gap%,(inp%=3)-(inp%=1)
  1479.   UNTIL inp%=2
  1480.   CLR compileflag!
  1481. RETURN
  1482. '
  1483. PROCEDURE skip
  1484.   @eraeditfeld
  1485. RETURN
  1486. '
  1487. PROCEDURE ask
  1488.   LOCAL inp%
  1489.   IF edflag!
  1490.     PRINT CHR$(7);
  1491.     WHILE MOUSEK
  1492.     WEND
  1493.     ALERT 2,"  Was machen wir mit dem  |  aktuellen Takt ?| ",1,"Replace|Insert|Skip",inp%
  1494.     IF inp%<>3
  1495.       @put_t_to_taktfeld
  1496.     ENDIF
  1497.     ON inp% GOSUB replace,insert,skip
  1498.   ENDIF
  1499.   CLR edflag!
  1500. RETURN
  1501. '
  1502. PROCEDURE insert
  1503.   LOCAL i%,j%
  1504.   j%=filep%
  1505.   WHILE LEN(takt$(1)+takt$(2)+takt$(0))<>0
  1506.     FOR i%=0 TO 2
  1507.       SWAP takt$(i%),takte$(i%,j%)
  1508.     NEXT i%
  1509.     INC j%
  1510.   WEND
  1511.   INC filep%
  1512.   INC maxfilep%
  1513.   CLR compileflag!,edflag!
  1514. RETURN
  1515. '
  1516. PROCEDURE replace
  1517.   LOCAL i%
  1518.   FOR i%=0 TO 2
  1519.     takte$(i%,filep%)=takt$(i%)
  1520.   NEXT i%
  1521.   SUB maxfilep%,maxfilep%=filep%
  1522.   CLR compileflag!,edflag!
  1523. RETURN
  1524. '
  1525. PROCEDURE volume
  1526.   LOCAL i%,screen$,inp$
  1527.   SGET screen$
  1528.   PBOX 8,0,631,60
  1529.   BOX 8,0,631,60
  1530.   FOR i%=0 TO 2
  1531.     REPEAT
  1532.       PRINT AT(3,1+i%);"Lautstärke von Stimme ";i%;" : ";STR$(volume%(i%));" ? ";
  1533.       FORM INPUT 2,inp$
  1534.       IF inp$<>""
  1535.         volume%(i%)=VAL(inp$)
  1536.       ENDIF
  1537.     UNTIL volume%(i%)>=0 AND volume%(i%)<=15
  1538.   NEXT i%
  1539.   SPUT screen$
  1540.   CLR screen$
  1541. RETURN
  1542. '
  1543. PROCEDURE compile_all(j%)
  1544.   LOCAL i%,tt$,inp%,p%
  1545.   CLR inp%
  1546.   IF j%=0
  1547.     @clear_vorz
  1548.   ENDIF
  1549.   LET sound$=CHR$(7)+CHR$(56)
  1550.   FOR i%=0 TO 2
  1551.     LET sound$=sound$+CHR$(i%+8)+CHR$(volume%(i%))
  1552.   NEXT i%
  1553.   p%=LEN(sound$)+1
  1554.   LET sound$=sound$+STRING$(32760-LEN(sound$),CHR$(0))
  1555.   compileflag!=TRUE
  1556.   WHILE takte$(0,j%)<>"" AND takte$(1,j%)<>"" AND takte$(2,j%)<>""
  1557.     PRINT AT(1,3);"Compiling Takt ";j%
  1558.     takt$(0)=takte$(0,j%)
  1559.     takt$(1)=takte$(1,j%)
  1560.     takt$(2)=takte$(2,j%)
  1561.     @comptakt(*tt$)
  1562.     IF compileerror!
  1563.       ALERT 2,"Weiter machen?",2," ja | Edit ",inp%
  1564.       IF inp%=2
  1565.         CLR compileflag!
  1566.         filep%=j%
  1567.       ENDIF
  1568.     ENDIF
  1569.     EXIT IF inp%=2
  1570.     MID$(sound$,p%)=tt$
  1571.     ADD p%,LEN(tt$)
  1572.     INC j%
  1573.   WEND
  1574.   @find_akt_vorz
  1575.   PRINT AT(1,3),,,
  1576.   MID$(sound$,p%)=CHR$(255)+CHR$(0)
  1577.   LET sound$=LEFT$(sound$,p%+1)
  1578. RETURN
  1579. '
  1580. PROCEDURE play_all(start%)
  1581.   IF NOT compileflag!
  1582.     @compile_all(start%)
  1583.   ENDIF
  1584.   VOID FRE(0)
  1585.   VOID XBIOS(32,L:VARPTR(sound$))
  1586. RETURN
  1587. '
  1588. PROCEDURE read_sound
  1589.   LOCAL lof%
  1590.   @select_file("SON")
  1591.   IF sel!
  1592.     IF EXIST(pfad$+name$)
  1593.       OPEN "R",#69,pfad$+name$
  1594.       lof%=LOF(#69)
  1595.       CLOSE #69
  1596.       IF lof%>0
  1597.         LET sound$=STRING$(lof%,CHR$(0))
  1598.         BLOAD pfad$+name$,VARPTR(sound$)
  1599.         compileflag!=TRUE
  1600.       ELSE
  1601.         ALERT 3,"Dateilänge ist NULL",1,"   OK   ",dummy
  1602.       ENDIF
  1603.     ELSE
  1604.       ALERT 3,"Es existiert keine Datei mit|Namen:|"+name$,1,"   OK   ",dummy
  1605.     ENDIF
  1606.   ENDIF
  1607. RETURN
  1608. '
  1609. PROCEDURE save_sound
  1610.   IF NOT compileflag!
  1611.     @compile_all(0)
  1612.   ENDIF
  1613.   @select_file("SON")
  1614.   IF sel!
  1615.     BSAVE pfad$+name$,VARPTR(sound$),LEN(sound$)
  1616.   ENDIF
  1617. RETURN
  1618. '
  1619. PROCEDURE delete
  1620.   LOCAL inp%,i%,j%
  1621.   ALERT 2," Haben sie sich das gründlich |      überlegt ? | ",2,"freilich|nicht so",inp%
  1622.   IF inp%=1
  1623.     j%=filep%
  1624.     REPEAT
  1625.       FOR i%=0 TO 2
  1626.         takte$(i%,j%)=takte$(i%,j%+1)
  1627.       NEXT i%
  1628.       INC j%
  1629.     UNTIL takte$(0,j%)="" OR takte$(1,j%)="" OR takte$(2,j%)=""
  1630.     DEC maxfilep%
  1631.     CLR compileflag!
  1632.   ENDIF
  1633. RETURN
  1634. '
  1635. PROCEDURE fehler
  1636.   LOCAL inp%,i%,j%
  1637.   IF ERR=-33
  1638.     fileerror!=TRUE
  1639.     ON ERROR GOSUB fehler
  1640.     RESUME NEXT
  1641.   ELSE
  1642.     ALERT 1," Katastrophaler Fehler! | | Retten, was zu retten ist ?| ",0," Jaaa.. |Weg mit!",inp%
  1643.     IF inp%=1
  1644.       CLR name$
  1645.       GOSUB write_file(0,maxfilep%)
  1646.     ENDIF
  1647.     ALERT 2," | |         Was nun ?           | ",0,"Abbruch|Neustart",inp%
  1648.     IF inp%=2
  1649.       RUN
  1650.     ELSE
  1651.       RESUME
  1652.     ENDIF
  1653.   ENDIF
  1654. RETURN
  1655. '
  1656. PROCEDURE put_to_buf
  1657.   LOCAL i%
  1658.   @put_t_to_taktfeld
  1659.   FOR i%=0 TO 2
  1660.     taktbuf$(i%)=takt$(i%)
  1661.   NEXT i%
  1662. RETURN
  1663. '
  1664. PROCEDURE get_from_buf
  1665.   LOCAL i%
  1666.   FOR i%=0 TO 2
  1667.     takt$(i%)=taktbuf$(i%)
  1668.   NEXT i%
  1669.   @eraeditfeld
  1670.   CLR neu!
  1671.   edflag!=TRUE
  1672. RETURN
  1673. '
  1674. PROCEDURE change_speed(s%)
  1675.   LOCAL i%,j%
  1676.   @put_t_to_taktfeld
  1677.   FOR i%=0 TO 2
  1678.     FOR j%=3 TO LEN(takt$(i%))
  1679.       IF VAL(MID$(takt$(i%),j%))
  1680.         IF VAL(MID$(takt$(i%),j%-1))<>0 OR MID$(takt$(i%),j%-1,1)="P"
  1681.           MID$(takt$(i%),j%)=CHR$(ASC(MID$(takt$(i%),j%))+s%)
  1682.         ENDIF
  1683.       ENDIF
  1684.     NEXT j%
  1685.     takte$(i%,filep%)=takt$(i%)
  1686.   NEXT i%
  1687.   edflag!=FALSE
  1688. RETURN
  1689. '
  1690. PROCEDURE find_akt_vorz
  1691.   LOCAL i%,temp$
  1692.   FOR i%=filep% DOWNTO 0
  1693.     temp$=LEFT$(takte$(0,i%))
  1694.     EXIT IF temp$>="a" AND temp$<="h" AND temp$<>"b"
  1695.   NEXT i%
  1696.   IF i%>=0
  1697.     temp$=takt$(0)
  1698.     takt$(0)=takte$(0,i%)
  1699.     @set_glob_vorz
  1700.     takt$(0)=temp$
  1701.     PRINT AT(50,3);"Vorzeichen in Taktnr. ";i%;"  "
  1702.   ENDIF
  1703. RETURN
  1704. '
  1705. PROCEDURE anleitung
  1706.   LOCAL screen$,d$,lc%,inp$,fileerror!
  1707.   fileerror!=FALSE
  1708.   OPEN "I",#68,"MUSIC.DOC"
  1709.   IF fileerror!
  1710.     ALERT 3,"Das file 'MUSIC.DOC' muß sich|im selben Ordner befinden,|von dem aus das Programm|gestartet wurde!",1,"Abbruch",dummy
  1711.   ELSE
  1712.     SGET screen$
  1713.     CLOSEW 0
  1714.     CLS
  1715.     WHILE NOT EOF(#68)
  1716.       LINE INPUT #68,d$
  1717.       INC lc%
  1718.       IF lc%>22
  1719.         PRINT "-MEHR-";CHR$(27);"p ";CHR$(27);"q";CHR$(13);
  1720.         REPEAT
  1721.           inp$=INKEY$
  1722.         UNTIL inp$<>""
  1723.         lc%=-22*inp$<>" "
  1724.       ENDIF
  1725.       PRINT SPACE$(20);CHR$(13);d$
  1726.       EXIT IF inp$=CHR$(3)
  1727.     WEND
  1728.     IF inp$<>CHR$(3)
  1729.       REPEAT
  1730.       UNTIL INKEY$<>""
  1731.     ENDIF
  1732.     OPENW 0
  1733.     SPUT screen$
  1734.     CLOSE #68
  1735.     CLR screen$
  1736.   ENDIF
  1737. RETURN
  1738. '
  1739. PROCEDURE break
  1740. RETURN
  1741. '
  1742. PROCEDURE disable
  1743.   LOCAL i%
  1744.   FOR i%=0 TO 5
  1745.     MENU i%+3,2
  1746.   NEXT i%
  1747. RETURN
  1748.